package com.bw.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.bw.common.JwtUtils;
import com.bw.common.Md5Utils;
import com.bw.entity.User;
import com.bw.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.List;

@Controller
public class LoginController {

    @Autowired
    UserService userService;

    /**
     * 访问登录页面
     *
     * @return
     */
    @RequestMapping("/loginPage.do")
    public String loginPage() {

        return "login";

    }







    /**
     *
     * JSR303验证
     * 点击按钮 执行登录
     *
     * @return
     */
    @RequestMapping("/login.do")
    public String login(@Valid User loginUser, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response) {
        //1. 非空 或者格式校验
        if (result.hasErrors()){

            String defaultMessage = result.getAllErrors().get(0).getDefaultMessage();

            model.addAttribute("error",defaultMessage);

            return "login";

        }

        //2. 用户名是否存在

        User userDB = userService.selectByName(loginUser.getName());
        if (userDB == null) {
            model.addAttribute("error", "用户名不存在");
            return "login";
        }
        //3. 密码是否正确
        String loginPassword = loginUser.getPassword();  //用户输入的密码 123

        String salt = userDB.getSalt(); //数据库里的盐  qwer

        String dbPassword = userDB.getPassword();  //数据库里的密码  beb6b72231daafe7d913baa818a63f0c

        // 加密用户输入的密码 和数据库里的盐
        String md5String = Md5Utils.getMD5String(loginPassword + salt);  //  beb6b72231daafe7d913baa818a63f0c

        if (!md5String.equals(dbPassword)) {
            model.addAttribute("error", "密码错误");
            return "login";
        }

        // 4. 加密用户信息  制作令牌 token，  返回给用户的浏览器

        String token = JwtUtils.createToken(userDB);

        // 把token 放入cookie里

        Cookie cookie = new Cookie("token", token);
        // 把cookie返回给 浏览器  浏览器 会自动保存
        response.addCookie(cookie);


//        return "list"; //  list是 jsp文件的名字， 返回一个    HTML 页面  浏览器会解析这个页面




        return "redirect:list.do";  // list.do 是一个网址   返回的是一个指令 ： 要求浏览器去访问 list.do这个url



    }
}
